package auth

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"path/filepath"
	"skedule-backend/config"
	"skedule-backend/utils"
)

// GetConfig 获取认证配置
func GetConfig() (*config.AuthConfig, error) {
	cfg, err := config.GetConfig()
	if err != nil {
		return nil, err
	}
	return &cfg.Auth, nil
}

// ValidateCredentials 验证用户凭据
func ValidateCredentials(username, encryptedPassword string) bool {
	authCfg, err := GetConfig()
	if err != nil {
		return false
	}
	return authCfg.ValidateCredentials(username, encryptedPassword)
}

// EncryptPassword 加密密码（MD5+盐）
func EncryptPassword(password, salt string) string {
	// 将密码和盐拼接
	data := []byte(password + salt)
	
	// 计算MD5
	hash := md5.Sum(data)
	
	// 转换为16进制字符串
	return hex.EncodeToString(hash[:])
}

// GetSalt 获取当前盐值
func GetSalt() string {
	authCfg, err := GetConfig()
	if err != nil {
		return ""
	}
	return authCfg.Salt
}

// UpdatePassword 更新用户密码
func UpdatePassword(username, encryptedPassword string) error {
	cfg, err := config.GetConfig()
	if err != nil {
		return fmt.Errorf(utils.T("auth.config.get.failed"), err)
	}

	// 验证用户名
	if username != cfg.Auth.Username {
		return fmt.Errorf(utils.T("auth.username.incorrect"))
	}

	// 更新密码
	cfg.Auth.Password = encryptedPassword

	// 获取配置文件路径
	configPath, err := getConfigPath()
	if err != nil {
		return fmt.Errorf("failed to get config path: %v", err)
	}

	// 保存配置
	return config.SaveConfigToFile(cfg, configPath)
}

// getConfigPath 获取配置文件路径（基于可执行文件目录）
func getConfigPath() (string, error) {
	// 获取可执行文件所在目录
	execDir, err := config.GetExecutableDir()
	if err != nil {
		return "", err
	}
	
	// 配置文件在可执行文件同目录下
	return filepath.Join(execDir, "config.json"), nil
} 